home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / ALLERLEI / GOBJ_112 / SOURCE / BEISPIEL / BEISPL07.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-03-03  |  13.5 KB  |  581 lines

  1. program Beispiel; {$X+} { Beispiel Nr.7 }
  2.  
  3. uses
  4.     
  5.     Gem,Objects,OTypes,OProcs,OWindows,ODialogs;
  6.  
  7. const
  8.  
  9.     {$I beispiel.i}
  10.  
  11. type
  12.  
  13.     PBeispielWindow = ^TBeispielWindow;
  14.     PAttrDialog     = ^TAttrDialog;
  15.     PLineData       = ^TLineData;
  16.     PLinie          = ^TLinie;
  17.     PPunkt          = ^TPunkt;
  18.     PAbout          = ^TAbout;
  19.     PNew            = ^TNew;
  20.     POpen           = ^TOpen;
  21.     PSave           = ^TSave;
  22.     PSaveAs         = ^TSaveAs;
  23.     PInfo           = ^TInfo;
  24.     PAttrib         = ^TAttrib;
  25.  
  26.     TMyApplication = object(TApplication)
  27.         save  : PSave;
  28.         saveas: PSaveAs;
  29.         procedure InitInstance; virtual;
  30.         procedure InitMainWindow; virtual;
  31.     end;
  32.  
  33.     TBeispielWindow = object(TWindow)
  34.         Veraendert: boolean;
  35.         Dicke,
  36.         Farbe,
  37.         Art       : integer;
  38.         Pfad,
  39.         Datei     : string;
  40.         Zeichnung : PCollection;
  41.         constructor Init(AParent: PWindow; ATitle: string);
  42.         destructor Done; virtual;
  43.         function CanClose: boolean; virtual;
  44.         procedure Paint(var PaintInfo: TPaintStruct); virtual;
  45.         procedure WMButton(mX,mY,BStat,KStat,Clicks: integer); virtual;
  46.         { neue Methoden: }
  47.         procedure SetAttr(Width,Color,Style: integer); virtual;
  48.         procedure CreateTitle; virtual;
  49.         procedure Speichern; virtual;
  50.     end;
  51.  
  52.     TAttrDialog = object(TDialog)
  53.         function OK: boolean; virtual;
  54.         function Help: boolean; virtual;
  55.     end;
  56.  
  57.     TLineData = record
  58.         Farben: array [0..7] of integer;
  59.         Stile : array [1..6] of integer;
  60.         Breite: string[5]
  61.     end;
  62.  
  63.     TLinie = object(TObject)
  64.         Punkte: PCollection;
  65.         Dicke,
  66.         Farbe,
  67.         Art   : integer;
  68.         constructor Init(Width,Color,Style: integer);
  69.         destructor Done; virtual;
  70.         procedure NeuerPunkt(AX,AY: integer); virtual;
  71.         procedure Zeichnen; virtual;
  72.         procedure Speichern; virtual;
  73.     end;
  74.  
  75.     TPunkt = object(TObject)
  76.         X,
  77.         Y: integer;
  78.         constructor Init(AX,AY: integer);
  79.     end;
  80.  
  81.     TAbout  = object(TKeyMenu)
  82.         procedure Work; virtual;
  83.     end;
  84.  
  85.     TNew    = object(TKeyMenu)
  86.         procedure Work; virtual;
  87.     end;
  88.  
  89.     TOpen   = object(TKeyMenu)
  90.         procedure Work; virtual;
  91.     end;
  92.  
  93.     TSave   = object(TKeyMenu)
  94.         procedure Work; virtual;
  95.     end;
  96.  
  97.     TSaveAs = object(TKeyMenu)
  98.         procedure Work; virtual;
  99.     end;
  100.  
  101.     TInfo   = object(TKeyMenu)
  102.         procedure Work; virtual;
  103.     end;
  104.  
  105.     TAttrib = object(TKeyMenu)
  106.         LineData: TLineData;
  107.         procedure Work; virtual;
  108.     end;
  109.  
  110. var
  111.  
  112.     MyApp: TMyApplication;
  113.     f    : file of integer;
  114.  
  115.  
  116. procedure MyResource; external; {$L beispiel.o}
  117.  
  118.  
  119. procedure TMyApplication.InitInstance;
  120.  
  121.     begin
  122.         InitResource(@MyResource,nil);
  123.         LoadMenu(BSPMENU);
  124.         new(PAbout,Init(@self,K_CTRL,Ctrl_A,MABOUT,MTITLE1));
  125.         new(PNew,Init(@self,K_CTRL,Ctrl_N,MNEW,MTITLE2));
  126.         new(POpen,Init(@self,K_CTRL,Ctrl_O,MOPEN,MTITLE2));
  127.         save:=new(PSave,Init(@self,K_CTRL,Ctrl_S,MSAVE,MTITLE2));
  128.         saveas:=new(PSaveAs,Init(@self,K_CTRL,Ctrl_D,MSAVEAS,MTITLE2));
  129.         new(PInfo,Init(@self,K_CTRL,Ctrl_I,MINFO,MTITLE3));
  130.         new(PAttrib,Init(@self,K_CTRL,Ctrl_T,MATTR,MTITLE3));
  131.         inherited InitInstance;
  132.         SetQuit(MQUIT,MTITLE2);
  133.         save^.Disable;
  134.         saveas^.Disable
  135.     end;
  136.  
  137.  
  138. procedure TMyApplication.InitMainWindow;
  139.  
  140.     begin
  141.         new(PBeispielWindow,Init(nil,'Beispiel  [unbenannt]'));
  142.         if (MainWindow=nil) or (ChkError<em_OK) then
  143.             Status:=em_InvalidMainWindow
  144.     end;
  145.  
  146.  
  147. constructor TBeispielWindow.Init(AParent: PWindow; ATitle: string);
  148.  
  149.     begin
  150.         if not(inherited Init(AParent,ATitle)) then fail;
  151.         new(Zeichnung,Init(10,10));
  152.         Veraendert:=false;
  153.         SetAttr(3,Blue,LT_SOLID);
  154.         Datei:='';
  155.         Pfad:=''
  156.     end;
  157.  
  158.  
  159. destructor TBeispielWindow.Done;
  160.  
  161.     begin
  162.         dispose(Zeichnung,Done);
  163.         inherited Done
  164.     end;
  165.  
  166.  
  167. function TBeispielWindow.CanClose: boolean;
  168.     var valid: boolean;
  169.  
  170.     begin
  171.         valid:=inherited CanClose;
  172.         if valid and Veraendert then
  173.             valid:=(Application^.Alert(@self,1,WAIT,
  174.                 ' Die Grafik wurde verändert!| Wollen Sie sie speichern?',
  175.               '&Ja|  &Nein  ')=2);
  176.         CanClose:=valid
  177.     end;
  178.  
  179.  
  180. procedure ZeichneLinienzug(p: PLinie);
  181.  
  182.     begin
  183.         p^.Zeichnen
  184.     end;
  185.  
  186.  
  187. procedure TBeispielWindow.Paint(var PaintInfo: TPaintStruct);
  188.  
  189.     begin
  190.         Zeichnung^.ForEach(@ZeichneLinienzug)
  191.     end;
  192.  
  193.  
  194. procedure TBeispielWindow.WMButton(mX,mY,BStat,KStat,Clicks: integer);
  195.     var xalt,yalt,btn,dummy: integer;
  196.         pxyarray           : ptsin_ARRAY;
  197.         ALinie             : PLinie;
  198.  
  199.     begin
  200.         if bTst(BStat,1) then
  201.             if GetDC>=0 then
  202.                 begin
  203.                     wind_update(BEG_MCTRL);
  204.                     vsl_width(vdiHandle,Dicke);
  205.                     vsl_color(vdiHandle,Farbe);
  206.                     vsl_type(vdiHandle,Art);
  207.                     vsl_ends(vdiHandle,LE_ROUNDED,LE_ROUNDED);
  208.                     ALinie:=new(PLinie,Init(Dicke,Farbe,Art));
  209.                     Zeichnung^.Insert(ALinie);
  210.                     ALinie^.NeuerPunkt(mX-Work.X,mY-Work.Y);
  211.                     repeat
  212.                         xalt:=mX;
  213.                         yalt:=mY;
  214.                         repeat
  215.                             graf_mkstate(mX,mY,btn,dummy)
  216.                         until (mX<>xalt) or (mY<>yalt) or not(bTst(btn,1));
  217.                         pxyarray[0]:=xalt;
  218.                         pxyarray[1]:=yalt;
  219.                         pxyarray[2]:=mX;
  220.                         pxyarray[3]:=mY;
  221.                         v_pline(vdiHandle,2,pxyarray);
  222.                         ALinie^.NeuerPunkt(mX-Work.X,mY-Work.Y)
  223.                     until not(bTst(btn,1));
  224.                     wind_update(END_MCTRL);
  225.                     ReleaseDC;
  226.                     Veraendert:=true;
  227.                     CreateTitle;
  228.                     MyApp.saveas^.Enable;
  229.                     if length(Datei)>0 then MyApp.save^.Enable
  230.                 end;
  231.         if bTst(BStat,2) then
  232.             begin
  233.                 Zeichnung^.FreeAll;
  234.                 ForceRedraw;
  235.                 Veraendert:=false;
  236.                 CreateTitle;
  237.                 MyApp.save^.Disable;
  238.                 MyApp.saveas^.Disable
  239.             end
  240.     end;
  241.  
  242.  
  243. procedure TBeispielWindow.SetAttr(Width,Color,Style: integer);
  244.     const farben: array [0..7] of string[7] =
  245.         ('weiß','schwarz','rot','grün','blau','türkis','gelb','violett');
  246.                 arten: array [1..6] of string[16] =
  247.         ('durchgehend','langer Strich','Punkte','Strich, Punkt',
  248.                                      'Strich','Strich, 2 Punkte');
  249.  
  250.     begin
  251.         Dicke:=Width;
  252.         Farbe:=Color;
  253.         Art:=Style;
  254.         SetSubTitle(' Dicke: '+ltoa(Dicke)+'  Farbe: '+farben[Farbe]+
  255.                                 '   Art: '+arten[Art])
  256.     end;
  257.  
  258.  
  259. procedure TBeispielWindow.CreateTitle;
  260.     var titel: string;
  261.  
  262.     begin
  263.         if length(Datei)=0 then titel:='[unbenannt]'
  264.         else
  265.             titel:=Pfad+Datei;
  266.         if Veraendert then titel:='*'+titel;
  267.         titel:='Beispiel  '+titel;
  268.         SetTitle(titel)
  269.     end;
  270.  
  271.  
  272. procedure SpeichereLinienzug(p: PLinie);
  273.  
  274.     begin
  275.         p^.Speichern
  276.     end;
  277.  
  278.  
  279. procedure TBeispielWindow.Speichern;
  280.  
  281.     begin
  282.         BusyMouse;
  283.         assign(f,Pfad+Datei);
  284.         rewrite(f);
  285.         Zeichnung^.ForEach(@SpeichereLinienzug);
  286.         close(f);
  287.         ArrowMouse;
  288.         Veraendert:=false;
  289.         CreateTitle
  290.     end;
  291.  
  292.  
  293. function TAttrDialog.OK: boolean;
  294.     var valid: boolean;
  295.         d,f,s: integer;
  296.         attrb: ARRAY_4;
  297.  
  298.     begin
  299.         valid:=inherited OK;
  300.         if valid then
  301.             begin
  302.                 with PLineData(TransferBuffer)^ do
  303.                     begin
  304.                         f:=0;
  305.                         while Farben[f]<>bf_Checked do inc(f);
  306.                         s:=1;
  307.                         while Stile[s]<>bf_Checked do inc(s);
  308.                         vsl_width(vdiHandle,atol(Breite))
  309.                     end;
  310.                 vql_attributes(vdiHandle,attrb);
  311.                 PBeispielWindow(Application^.MainWindow)^.SetAttr(attrb[3],f,s)
  312.             end;
  313.         OK:=valid
  314.     end;
  315.  
  316.  
  317. function TAttrDialog.Help: boolean;
  318.  
  319.     begin
  320.         Application^.Alert(@self,1,NO_ICON,'In dieser Dialogbox werden die|Attribute der Linien eingestellt.|Die neuen Werte gelten ab der|ersten Linie, die nach dem|Schließen der Box gezeichnet|wird.','   &OK   ');
  321.         Help:=false
  322.     end;
  323.  
  324.  
  325. constructor TLinie.Init(Width,Color,Style: integer);
  326.  
  327.     begin
  328.         if not(inherited Init) then fail;
  329.         new(Punkte,Init(50,50));
  330.         Dicke:=Width;
  331.         Farbe:=Color;
  332.         Art:=Style
  333.     end;
  334.  
  335.  
  336. destructor TLinie.Done;
  337.  
  338.     begin
  339.         dispose(Punkte,Done);
  340.         inherited Done
  341.     end;
  342.  
  343.  
  344. procedure TLinie.NeuerPunkt(AX,AY: integer);
  345.  
  346.     begin
  347.         Punkte^.Insert(new(PPunkt,Init(AX,AY)))
  348.     end;
  349.  
  350.  
  351. procedure TLinie.Zeichnen;
  352.     var q       : longint;
  353.         vh,dx,dy: integer;
  354.         pxyarray: ptsin_ARRAY;
  355.  
  356.     begin
  357.         if Punkte^.Count>1 then
  358.             begin
  359.                 with Application^ do
  360.                     begin
  361.                         vh:=vdiHandle;
  362.                         dx:=MainWindow^.Work.X;
  363.                         dy:=MainWindow^.Work.Y
  364.                     end;
  365.                 vsl_width(vh,Dicke);
  366.                 vsl_color(vh,Farbe);
  367.                 vsl_type(vh,Art);
  368.                 vsl_ends(vh,LE_ROUNDED,LE_ROUNDED);
  369.                 with PPunkt(Punkte^.At(0))^ do
  370.                     begin
  371.                         pxyarray[2]:=X+dx;
  372.                         pxyarray[3]:=Y+dy
  373.                     end;
  374.                 for q:=1 to pred(Punkte^.Count) do
  375.                     with PPunkt(Punkte^.At(q))^ do
  376.                         begin
  377.                             pxyarray[0]:=pxyarray[2];
  378.                             pxyarray[1]:=pxyarray[3];
  379.                             pxyarray[2]:=X+dx;
  380.                             pxyarray[3]:=Y+dy;
  381.                             v_pline(vh,2,pxyarray)
  382.                         end
  383.             end
  384.     end;
  385.  
  386.  
  387. procedure TLinie.Speichern;
  388.     var q  : longint;
  389.         cnt: integer;
  390.  
  391.     begin
  392.         cnt:=Punkte^.Count;
  393.         if cnt>0 then
  394.             begin
  395.                 write(f,Dicke,Farbe,Art,cnt);
  396.                 for q:=0 to pred(cnt) do
  397.                     with PPunkt(Punkte^.At(q))^ do
  398.                         write(f,X,Y)
  399.             end
  400.     end;
  401.  
  402.  
  403. constructor TPunkt.Init(AX,AY: integer);
  404.  
  405.     begin
  406.         if not(inherited Init) then fail;
  407.         X:=AX;
  408.         Y:=AY
  409.     end;
  410.  
  411.  
  412. procedure TAbout.Work;
  413.  
  414.     begin
  415.         if ADialog=nil then
  416.             begin
  417.                 new(ADialog,Init(nil,'Über Beispiel',BSPABOUT));
  418.                 if ADialog<>nil then
  419.                     begin
  420.                         new(PGroupBox,Init(ADialog,IGROUP,'ObjectGEM '+
  421.                                                                 'Beispielprogramm','"42"'));
  422.                         new(PButton,Init(ADialog,IOK,id_OK,true,'Mit diesem '+
  423.                                             'Button|kann die Infobox|verlassen werden.'))
  424.                     end
  425.             end;
  426.         if ADialog<>nil then ADialog^.MakeWindow
  427.     end;
  428.  
  429.  
  430. procedure TNew.Work;
  431.  
  432.     begin
  433.         with PBeispielWindow(Application^.MainWindow)^ do
  434.             begin
  435.                 Zeichnung^.FreeAll;
  436.                 ForceRedraw;
  437.                 Veraendert:=false;
  438.                 Pfad:='';
  439.                 Datei:='';
  440.                 CreateTitle;
  441.                 MyApp.save^.Disable;
  442.                 MyApp.saveas^.Disable
  443.             end
  444.     end;
  445.  
  446.  
  447. procedure TOpen.Work;
  448.     var ALinie           : PLinie;
  449.         width,color,style: integer;
  450.         cnt,x,y          : integer;
  451.         q                : longint;
  452.  
  453.     begin
  454.         with PBeispielWindow(Application^.MainWindow)^ do
  455.             if FileSelect(nil,'BEISPIEL-LINIEN LADEN','*.BLN',
  456.                                             Pfad,Datei,true) then
  457.                 begin
  458.                     BusyMouse;
  459.                     Zeichnung^.FreeAll;
  460.                     assign(f,Pfad+Datei);
  461.                     reset(f);
  462.                     while not(eof(f)) do
  463.                         begin
  464.                             read(f,width,color,style,cnt);
  465.                             ALinie:=new(PLinie,Init(width,color,style));
  466.                             Zeichnung^.Insert(ALinie);
  467.                             for q:=1 to cnt do
  468.                                 begin
  469.                                     read(f,x,y);
  470.                                     ALinie^.NeuerPunkt(x,y)
  471.                                 end
  472.                         end;
  473.                     close(f);
  474.                     ArrowMouse;
  475.                     Veraendert:=false;
  476.                     CreateTitle;
  477.                     ForceRedraw;
  478.                     MyApp.save^.Enable;
  479.                     MyApp.saveas^.Enable
  480.                 end
  481.     end;
  482.  
  483.  
  484. procedure TSave.Work;
  485.  
  486.     begin
  487.         PBeispielWindow(Application^.MainWindow)^.Speichern
  488.     end;
  489.  
  490.  
  491. procedure TSaveAs.Work;
  492.  
  493.     begin
  494.         with PBeispielWindow(Application^.MainWindow)^ do
  495.             if FileSelect(nil,'BEISPIEL-LINIEN SPEICHERN','*.BLN',
  496.                                             Pfad,Datei,false) then
  497.                 begin
  498.                     Speichern;
  499.                     MyApp.save^.Enable
  500.                 end
  501.     end;
  502.  
  503.  
  504. procedure TInfo.Work;
  505.  
  506.     begin
  507.         Application^.Alert(nil,1,NOTE,'Die Funktion ist noch|'+
  508.                                                     'nicht implementiert.',' &Schade ')
  509.     end;
  510.  
  511.  
  512. procedure TAttrib.Work;
  513.     var q: integer;
  514.  
  515.     begin
  516.         if ADialog=nil then
  517.             begin
  518.                 ADialog:=new(PAttrDialog,Init(nil,'Attribute',BSPATTR));
  519.                 if ADialog<>nil then
  520.                     begin
  521.                         new(PGroupBox,Init(ADialog,ACGROUP,'Farbe',
  522.                                                         'Bestimmt die|Linienfarbe'));
  523.                         new(PGroupBox,Init(ADialog,ASGROUP,'Stil',
  524.                                                         'Bestimmt den|Linienstil'));
  525.                         new(PRadioButton,Init(ADialog,AWHITE,true,
  526.                                                         'Setzt Weiß als|neue Linienfarbe'));
  527.                         new(PRadioButton,Init(ADialog,ABLACK,true,
  528.                                                         'Setzt Schwarz als|neue Linienfarbe'));
  529.                         new(PRadioButton,Init(ADialog,ARED,true,
  530.                                                         'Setzt Rot als|neue Linienfarbe'));
  531.                         new(PRadioButton,Init(ADialog,AGREEN,true,
  532.                                                         'Setzt Grün als|neue Linienfarbe'));
  533.                         new(PRadioButton,Init(ADialog,ABLUE,true,
  534.                                                         'Setzt Blau als|neue Linienfarbe'));
  535.                         new(PRadioButton,Init(ADialog,ACYAN,true,
  536.                                                         'Setzt Türkis als|neue Linienfarbe'));
  537.                         new(PRadioButton,Init(ADialog,AYELLOW,true,
  538.                                                         'Setzt Gelb als|neue Linienfarbe'));
  539.                         new(PRadioButton,Init(ADialog,AMAGENTA,true,
  540.                                                         'Setzt Violett als|neue Linienfarbe'));
  541.                         new(PRadioButton,Init(ADialog,ASOLID,true,
  542.                                                         'Setzt LT_SOLID als|neuen Linienstil'));
  543.                         new(PRadioButton,Init(ADialog,ALONG,true,
  544.                                                         'Setzt LT_LONGDASH als|neuen Linienstil'));
  545.                         new(PRadioButton,Init(ADialog,ADOTS,true,
  546.                                                         'Setzt LT_DOTTED als|neuen Linienstil'));
  547.                         new(PRadioButton,Init(ADialog,ALINEDOT,true,
  548.                                                         'Setzt LT_DASHDOT als|neuen Linienstil'));
  549.                         new(PRadioButton,Init(ADialog,ALINE,true,
  550.                                                         'Setzt LT_DASHED als|neuen Linienstil'));
  551.                         new(PRadioButton,Init(ADialog,ALIN2DOT,true,
  552.                                                         'Setzt LT_DASHDOTDOT|als neuen Linienstil'));
  553.                         new(PEdit,Init(ADialog,AWIDTH,5,
  554.                                     'Gibt die Linien-|stärke an (1,3,..).|Immer UNgerade!'));
  555.                         new(PButton,Init(ADialog,ACANCEL,id_Cancel,true,
  556.                             'Bricht den Dialog ab,|ohne die neuen Werte|zu übernehmen'));
  557.                         new(PButton,Init(ADialog,AOK,id_OK,true,
  558.                                                     'Beendet den Dialog und|setzt die neuen Werte'));
  559.                         new(PButton,Init(ADialog,AHELP,id_Help,false,
  560.                             'Zeigt einen allgemeinen|Hilfstext über diesen|Dialog an.'));
  561.                         with PBeispielWindow(Application^.MainWindow)^ do
  562.                             with LineData do
  563.                                 begin
  564.                                     for q:=0 to 7 do Farben[q]:=bf_Unchecked;
  565.                                     for q:=1 to 6 do Stile[q]:=bf_Unchecked;
  566.                                     Farben[Farbe]:=bf_Checked;
  567.                                     Stile[Art]:=bf_Checked;
  568.                                     Breite:=ltoa(Dicke)
  569.                                 end;
  570.                         ADialog^.TransferBuffer:=@LineData
  571.                     end
  572.             end;
  573.         if ADialog<>nil then ADialog^.MakeWindow
  574.     end;
  575.  
  576.  
  577. begin
  578.     MyApp.Init('BSPL','Beispiel');
  579.     MyApp.Run;
  580.     MyApp.Done
  581. end.